﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TogheterWeBuyIt.Models
{
	public class PromocaoRepository
	{
		private PromocoesDBDataContext db = new PromocoesDBDataContext();

		public IQueryable<Promocao> GetPromocoes()
		{
			return db.Promocaos;
		}

        /// <summary>
        /// Retorna as promoções com mais participações
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public IQueryable<Promocao> GetTopPopulatedPromotions(int count)
        {
            return (from p in db.Promocaos
                    orderby p.ParticipaPromocaos.Count descending
                    select p).Take(count);
        }

        public IQueryable<Promocao> GetLastCreatedPromotion(int count)
        {
			return (from p in db.Promocaos
					orderby p.DataCriado descending
					select p).Take(count);
        }

		public int Add(Promocao promo)
		{
			db.Promocaos.InsertOnSubmit(promo);
			db.SubmitChanges();
			return (from insertedPromo in db.Promocaos
					select insertedPromo.Id).Max();
		}

		public Promocao GetPromocao(int id)
		{
			return db.Promocaos.SingleOrDefault(p => p.Id == id);
		}

		public void AddPromocaoProduto(PromocaoProduto promoProd)
		{
			db.PromocaoProdutos.InsertOnSubmit(promoProd);
			db.SubmitChanges();
		}

		internal void AddParticipaPromocao(ParticipaPromocao participaPromocao)
		{
			db.ParticipaPromocaos.InsertOnSubmit(participaPromocao);
			db.SubmitChanges();
		}

		internal IQueryable<Promocao> GetPromocoes(int id)
		{
			return from promo in db.Promocaos
				   where promo.PromocaoProdutos.Any(p => p.IdProduto == id)
				   select promo;
		}

		public void InserirComentario(ComentariosPromocao coment)
		{
			db.ComentariosPromocaos.InsertOnSubmit(coment);
			db.SubmitChanges();
		}

		public IQueryable<Promocao> GetPromocoes(string busca)
		{
			string[] strs = busca.Split(' ');
			IQueryable<Promocao> result = null;
			foreach (var item in strs)
			{
				IQueryable<Promocao> teste = from promo in db.Promocaos
					   where 
						promo.Descricao.ToLower().Contains(item.ToLower())
						||
					   promo.PromocaoProdutos.Any(p => 
								(p.Produto.Livro != null 
								&& 
									(p.Produto.Livro.Autor.ToLower().Contains(item.ToLower()))
									||
									(p.Produto.Livro.Nome.ToLower().Contains(item.ToLower()))
								)
								||
								(p.Produto.OutrosProduto != null && p.Produto.OutrosProduto.Nome.ToLower().Contains(item.ToLower()))
								||
								(p.Produto.PassagemAviao != null 
								&&
									(p.Produto.PassagemAviao.CidadeDestino.nom_cidade.ToLower().Contains(item.ToLower()))
									||
									(p.Produto.PassagemAviao.CidadeDestino.estado.nom_estado.ToLower().Contains(item.ToLower()))
									||
									(p.Produto.PassagemAviao.CidadeDestino.estado.sgl_estado.ToLower().Contains(item.ToLower()))
									|| 
									(p.Produto.PassagemAviao.CidadeOrigem.nom_cidade.ToLower().Contains(item.ToLower()))
									||
									(p.Produto.PassagemAviao.CidadeOrigem.estado.nom_estado.ToLower().Contains(item.ToLower()))
									||
									(p.Produto.PassagemAviao.CidadeOrigem.estado.sgl_estado.ToLower().Contains(item.ToLower()))
								)
						   ) select promo;

				if (result != null)
					result.Concat(teste);
				else
					result = teste;
			}

			return result.Distinct();
		}
	}
}
